<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<link href="../style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>认证、授权、访问控制 － Apache 2.2 中文手册 [金步国]</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="index.html"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path"><a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">HTTP Server</a> &gt; <a href="https://httpd.apache.org/docs/">文档</a> &gt; <a href="../index.html">版本2.2</a> &gt; <a href="index.html">如何.../指南</a></div>

<div id="translation-info">　　 <a href="../translator_announcement.html#thanks">致谢</a> | 本篇译者：<a href="../../../index.html">金步国</a>(<a href="../../../index.html">作品集</a>) | 本页最后更新：2008年8月11日</div>
<div id="page-content"><div id="preamble"><h1>认证、授权、访问控制</h1>


    <p>认证(Authentication)是指任何识别用户身份的过程。授权(Authorization)是允许特定用户访问特定区域或信息的过程。</p>
</div>
	<div class="top"><a href="auth.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="related" id="related">相关模块和指令</a></h2>

<p>认证和授权涉及到三组模块。通常，你需要从每一组中选择至少一个模块。</p>

<ul>
  <li>认证类型模块(参见<code class="directive"><a href="../mod/core.html#authtype">AuthType</a></code>指令)
    <ul>
      <li><code class="module"><a href="../mod/mod_auth_basic.html">mod_auth_basic</a></code></li>
      <li><code class="module"><a href="../mod/mod_auth_digest.html">mod_auth_digest</a></code></li>
    </ul>
  </li>
  <li>认证支持模块
    <ul>
      <li><code class="module"><a href="../mod/mod_authn_alias.html">mod_authn_alias</a></code></li>
      <li><code class="module"><a href="../mod/mod_authn_anon.html">mod_authn_anon</a></code></li>
      <li><code class="module"><a href="../mod/mod_authn_dbd.html">mod_authn_dbd</a></code></li>
      <li><code class="module"><a href="../mod/mod_authn_dbm.html">mod_authn_dbm</a></code></li>
      <li><code class="module"><a href="../mod/mod_authn_default.html">mod_authn_default</a></code></li>
      <li><code class="module"><a href="../mod/mod_authn_file.html">mod_authn_file</a></code></li>
      <li><code class="module"><a href="../mod/mod_authnz_ldap.html">mod_authnz_ldap</a></code></li>
    </ul>
  </li>
  <li>授权支持模块(参见<code class="directive"><a href="../mod/core.html#require">Require</a></code>指令)
    <ul>
      <li><code class="module"><a href="../mod/mod_authnz_ldap.html">mod_authnz_ldap</a></code></li>
      <li><code class="module"><a href="../mod/mod_authz_dbm.html">mod_authz_dbm</a></code></li>
      <li><code class="module"><a href="../mod/mod_authz_default.html">mod_authz_default</a></code></li>
      <li><code class="module"><a href="../mod/mod_authz_groupfile.html">mod_authz_groupfile</a></code></li>
      <li><code class="module"><a href="../mod/mod_authz_owner.html">mod_authz_owner</a></code></li>
      <li><code class="module"><a href="../mod/mod_authz_user.html">mod_authz_user</a></code></li>
    </ul>
  </li>
</ul>

  <p><code class="module"><a href="../mod/mod_authnz_ldap.html">mod_authnz_ldap</a></code>模块既包含认证功能也包含授权功能。<code class="module"><a href="../mod/mod_authn_alias.html">mod_authn_alias</a></code>模块自身并不实现认证功能，但是允许其它认证支持模块以更灵活的方式进行配置。</p>

  <p><code class="module"><a href="../mod/mod_authz_host.html">mod_authz_host</a></code>模块提供基于主机名、IP地址、请求特征的访问控制，但并不属于认证支持系统。</p>
  <p>你可能还希望阅读<a href="http://www.jinbuguo.com/apache/manual/howto/access.html">访问控制</a>一文来了解更多有关如何控制对服务器的访问。</p>

</div><div class="top"><a href="auth.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="introduction" id="introduction">简介</a></h2>
    <p>如果网站上有些敏感信息或只希望为一个小群体所访问，本文阐述的方法能确保用户只能访问被允许的资源。</p>

    <p>本文涵盖了保护站点资源的"标准"方法，大多数管理员将要用到这些方法。</p>
	<div class="note"><h3>注意:</h3><p>如果你的数据确实需要很高的安全性，那么在访问控制之外，你还应该使用<code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code>进行加密传输。</p></div>
</div><div class="top"><a href="auth.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="theprerequisites" id="theprerequisites">先决条件</a></h2>
    <p>本文中讨论的指令应该被放进主配置文件(通常在<code class="directive"><a href="../mod/core.html#directory">&lt;Directory&gt;</a></code>段中)或者针对单个目录的配置文件(<code>.htaccess</code>文件)中。</p>

    <p>如果你打算使用<code>.htaccess</code>文件，则必须设置服务器以允许在这些文件中使用认证指令，即用<code class="directive"><a href="../mod/core.html#allowoverride">AllowOverride</a></code>指令指定哪些指令在针对单个目录的配置文件中有效。</p>

    <p>既然本文讨论认证，就应该对<code class="directive"><a href="../mod/core.html#allowoverride">AllowOverride</a></code>这样设置：</p>

    <div class="example"><p><code>
      AllowOverride AuthConfig
    </code></p></div>

    <p>如果你希望把这些指令直接写入主配置文件，当然就需要具有对主配置文件的写权限。</p>

    <p>而且，你需要对服务器的目录结构有所了解，以确定某些文件的位置。这个并不难，需要时我们会做适当的说明。</p>
</div><div class="top"><a href="auth.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="gettingitworking" id="gettingitworking">启用认证</a></h2>
    <p>先介绍用密码来保护服务器上的目录。</p>

    <p>首先需要建立一个密码文件。具体如何创建这个文件与你使用什么样的认证支持模块有关(这里假定你使用<code class="module"><a href="../mod/mod_authn_file.html">mod_authn_file</a></code>模块)。这个文件应该放在不能被网络访问的位置，以避免被下载。例如，如果<code>/usr/local/apache2/htdocs</code>以外的空间不能被网络访问，那么可以考虑把密码文件放在<code>/usr/local/apache2/passwd</code>目录中。</p>

    <p>Apache在其安装目录的<code>bin</code>子目录中提供了<code class="program"><a href="../programs/htpasswd.html">htpasswd</a></code>工具，用于建立密码文件，可以这样使用：</p>

    <div class="example"><p><code>
      htpasswd -c /usr/local/apache2/passwd/passwords rbowen
    </code></p></div>

    <p><code class="program"><a href="../programs/htpasswd.html">htpasswd</a></code>会要你输入密码，并要求重新输入以进行确认：</p>

    <div class="example"><p><code>
      # htpasswd -c /usr/local/apache2/passwd/passwords rbowen<br />
      New password: mypassword<br />
      Re-type new password: mypassword<br />
      Adding password for user rbowen
    </code></p></div>

    <p>如果<code class="program"><a href="../programs/htpasswd.html">htpasswd</a></code>不在搜索路径中，则必须使用完整路径，如：<code>/usr/local/apache2/bin/htpasswd</code></p>

    <p>然后修改<code>httpd.conf</code>或<code>.htaccess</code>文件，指示服务器允许哪些用户访问并向用户索取密码。若要保护<code>/usr/local/apache2/htdocs/secret</code>目录，则可以将下列指令写入<code>/usr/local/apache2/htdocs/secret/.htaccess</code>或者<code>httpd.conf</code>的&lt;Directory
    /usr/local/apache2/apache/htdocs/secret&gt;段。</p>

    <div class="example"><p><code>
      AuthType Basic<br />
      AuthName "Restricted Files"<br />
      #(下面这一行是可选的)<br />
      AuthBasicProvider file<br />
      AuthUserFile /usr/local/apache2/passwd/passwords<br />
      Require user rbowen
    </code></p></div>

    <p>让我们逐个解释这些指令。<code class="directive"><a href="../mod/core.html#authtype">AuthType</a></code>指令选择对用户实施认证的方法，最常用的是由<code class="module"><a href="../mod/mod_auth_basic.html">mod_auth_basic</a></code>提供的<code>Basic</code> 。必须认识到的很重要的一点是，Basic认证方法并不加密来自用户浏览器的密码，因此，不应该用于高度敏感的数据(除非还使用了<code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code>)。Apache中还有另一种更安全的认证方法"<code>AuthType Digest</code>"，即由<code class="module"><a href="../mod/mod_auth_digest.html">mod_auth_digest</a></code>供的摘要认证。目前，只有比较新的浏览器版本(译者注：MSIE>=7,FF>=2,Opera>=9)才支持摘要认证。</p>

    <p><code class="directive"><a href="../mod/core.html#authname">AuthName</a></code>指令设置了使用认证的<dfn>域(Realm)</dfn>，它起两个作用，首先，此域会出现在显示给用户的密码提问对话框中，其次，也帮助客户端程序确定应该发送哪个密码。</p>

    <p>所以，如果一个用户已经在<code>"Restricted Files"</code>域通过了认证，则客户端就可以尝试使用同样的密码来访问同一个服务器上任何名为<code>"Restricted Files"</code>域的其他部分，从而使多个受限区域使用同一个密码，以避免用户重复输入。当然，出于安全考虑，如果服务器变了，客户端始终会要求重新输入密码。</p>

    <p><code class="directive"><a href="../mod/mod_authn_file.html#authuserfile">AuthUserFile</a></code>指令设置了密码文件的位置，也就是刚才我们用<code class="program"><a href="../programs/htpasswd.html">htpasswd</a></code>建立的文件。如果用户很多则认证速度会很慢，因为对每个请求都必须搜索这个纯文本文件，对此，Apache还支持把用户信息存入快速的数据库文件，<code class="module"><a href="../mod/mod_authn_dbm.html">mod_authn_dbm</a></code>模块提供了<code class="directive"><a href="../mod/mod_authn_dbm.html#authdbmuserfile">AuthDBMUserFile</a></code>指令，并可以用<code class="program"><a href="../programs/dbmmanage.html">dbmmanage</a></code>程序建立和操作这些数据库。<a href="http://modules.apache.org/">Apache模块数据库</a>中还提供了许多其他第三方模块提供的认证选项。</p>

    <p>最后，<code class="directive"><a href="../mod/core.html#require">Require</a></code>指令设置了允许访问受保护区域的用户，下一节将对<code class="directive"><a href="../mod/core.html#require">Require</a></code>指令作详细说明。</p>
</div><div class="top"><a href="auth.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="lettingmorethanonepersonin" id="lettingmorethanonepersonin">允许多人访问</a></h2>
    <p>上述指令只允许一个人(一个叫<code>rbowen</code>的用户)访问这个目录，但是多数情况下，都需要允许多人访问，所以就要用到<code class="directive"><a href="../mod/mod_authz_groupfile.html#authgroupfile">AuthGroupFile</a></code>指令。</p>

    <p>如果想允许多人访问，那么就必须建立一个组文件以确定组中的用户。其格式很简单，可以用你喜欢的编辑器建立，例如：</p>

   <div class="example"><p><code>
     GroupName: rbowen dpitts sungo rshersey
   </code></p></div>

    <p>它只是每组一行的一个用空格分隔的组成员列表。</p>

    <p>向已有的密码文件中增加一个用户，可以输入：</p>

    <div class="example"><p><code>
      htpasswd /usr/local/apache2/passwd/passwords dpitts
    </code></p></div>

    <p>程序的提示和上面的一样，但是它会追加到已有的文件中，而不是建一个新文件(参数 <code>-c</code> 可以强制建立新的密码文件)。</p>

    <p>现在，需要将<code>.htaccess</code>文件修改成这样：</p>

    <div class="example"><p><code>
      AuthType Basic<br />
      AuthName "By Invitation Only"<br />
      AuthUserFile /usr/local/apache2/passwd/passwords<br />
      AuthGroupFile /usr/local/apache2/passwd/groups<br />
      Require group GroupName
    </code></p></div>

    <p>现在，<code>GroupName</code>组中的成员都在<code>password</code>文件中有一个相应的记录，从而允许他们输入正确的密码进行访问。</p>

    <p>除了建立组文件，还有另一种途径允许多人访问，就是使用如下指令：</p>

    <div class="example"><p><code>
      Require valid-user
    </code></p></div>

    <p>使用上述指令，而不是 <code>Require user rbowen</code> ，可以允许密码文件中的所有用户使用正确的密码进行访问。通过为每个组建立一个密码文件，这里甚至允许列举各个组，其优点是Apache只需要检查一个文件(而不是两个)，其缺点是，必须维护众多密码文件，而且要确保<code class="directive"><a href="../mod/mod_authn_file.html#authuserfile">AuthUserFile</a></code>指定了一个正确的密码文件。</p>
</div><div class="top"><a href="auth.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="possibleproblems" id="possibleproblems">可能存在的问题</a></h2>
    <p>由于采用了Basic认证的方法，每次向服务器请求甚至刷新一个受保护的页面或图片时都必须校验用户名和密码，为此，必须打开密码文件并逐行搜索用户名，因此，服务器响应速度会受一些影响，受影响的程度与密码文件的大小成正比。</p>

    <p>所以，对密码文件中的用户总数存在一个实际上的上限，此上限取决于特定的服务器机器的性能，但是一般有几百个用户就会对响应速度有非常明显的影响，在这种情况下，可以考虑用其他认证方法。</p>
</div><div class="top"><a href="auth.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="whatotherneatstuffcanido" id="whatotherneatstuffcanido">其他认证方法</a></h2>
    <p>基于用户名和密码的认证只是方法之一，时常会有不需要知道来访者是谁，只需要知道来自哪里的情况。</p>

    <p><code class="directive"><a href="../mod/mod_authz_host.html#allow">Allow</a></code>和<code class="directive"><a href="../mod/mod_authz_host.html#deny">Deny</a></code>指令可以允许或拒绝来自特定主机名或主机地址的访问，同时，<code class="directive"><a href="../mod/mod_authz_host.html#order">Order</a></code>指令告诉Apache处理这两个指令的顺序，以改变过滤器。</p>

    <p>这些指令的用法：</p>

    <div class="example"><p><code>
      Allow from <var>address</var>
    </code></p></div>

    <p><var>address</var>可以是一个IP地址(或者IP地址的一部分)，也可以是一个完整的域名(或者域名的一部分)，还可以同时指定多个IP地址和域名。</p>

    <p>比如，要拒绝不受欢迎的兜售垃圾的站点：</p>

    <div class="example"><p><code>
      Deny from 205.252.46.165
    </code></p></div>

    <p>这样，这个指令所管辖的区域将拒绝所有来自该地址的访问。除了指定IP地址，也可以指定域名，如：</p>

    <div class="example"><p><code>
      Deny from <var>host.example.com</var>
    </code></p></div>

    <p>另外，还可以指定地址或域名的一部分来阻止一个群体：</p>

    <div class="example"><p><code>
      Deny from <var>192.101.205</var><br />
      Deny from <var>cyberthugs.com</var> <var>moreidiots.com</var><br />
      Deny from ke
    </code></p></div>

    <p><code class="directive"><a href="../mod/mod_authz_host.html#order">Order</a></code>可以组合<code class="directive"><a href="../mod/mod_authz_host.html#deny">Deny</a></code>和<code class="directive"><a href="../mod/mod_authz_host.html#allow">Allow</a></code>指令，以保证在允许一个群体访问的同时，对其中的一些又加以限制：</p>

    <div class="example"><p><code>
      Order deny,allow<br />
      Deny from all<br />
      Allow from <var>dev.example.com</var>
    </code></p></div>

    <p>只列出<code class="directive"><a href="../mod/mod_authz_host.html#allow">Allow</a></code>指令不会得到你想要的结果，因为它在允许指定对象访问的同时<em>并不禁止</em>其他未列出的对象的访问。所以上例使用的方法是：首先拒绝任何人，然后允许来自特定主机的访问。</p>
</div><div class="top"><a href="auth.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="moreinformation" id="moreinformation">更多信息</a></h2>
    <p><code class="module"><a href="../mod/mod_auth_basic.html">mod_auth_basic</a></code>和<code class="module"><a href="../mod/mod_authz_host.html">mod_authz_host</a></code>文档中有更多的有关资料。<code class="module"><a href="../mod/mod_authn_alias.html">mod_authn_alias</a></code>同样有助于简化认证配置。</p>
</div></div>
<div id="footer">
<p class="apache">本文允许自由的转载、引用、再分发，但必须保留译者署名并注明出处；详见：<a href="../translator_announcement.html#announcement">版权声明</a>。</p>
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p></div>
</body></html>